﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BolsaTalentos.DataContextClasses;
using System.Data.SqlClient;

namespace BolsaTalentos.BLL
{
    public class UsuarioEmpresa : BolsaTalentos.BLL.UsuarioAplicacion
    {
        // Campo
        private Empresa empresaProcedencia;
        private DateTime fechaCreacion;
        private bool siActivo;

        // Propiedades
        public Empresa EmpresaProcedencia
        {
            get { return this.empresaProcedencia; }
            set { this.empresaProcedencia = value; }
        }
        public DateTime FechaCreacion
        {
            get { return this.fechaCreacion; }
        }
        public bool SiActivo 
        {
            get { return this.siActivo; }
            set { this.siActivo = value; }
        }

        // Constructores
        public UsuarioEmpresa(int IDToSearch) 
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.UsuariosEmpresa UsrEmp = (from ue in DB.UsuariosEmpresas
                                                             where (ue.ID == IDToSearch)
                                                             select ue).First();

                this.id = UsrEmp.ID;
                this.userName = UsrEmp.UserName;
                this.passWord = UsrEmp.PassWord;
                this.fechaCreacion = UsrEmp.FechaCreacion;
                this.fechaPrimerIngreso = UsrEmp.FechaPrimerIngreso;
                this.fechaUltimoIngreso = UsrEmp.FechaUltimoIngreso;
                this.siActivo = UsrEmp.Activo;
                this.empresaProcedencia = new Empresa(UsrEmp.ID_Empresa);
            }
            catch (SqlException Sql)
            {                
                throw new Exception("No existe tal usuario\n" + Sql.Message);
            }
        }
        public UsuarioEmpresa(string UserNameToLog, string PassWordToLog) 
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.UsuariosEmpresa UsrEmp = (from ue in DB.UsuariosEmpresas
                                                             where (ue.UserName == UserNameToLog) && (ue.PassWord == PassWordToLog)
                                                             select ue).First();

                this.id = UsrEmp.ID;
                this.userName = UsrEmp.UserName;
                this.passWord = UsrEmp.PassWord;
                this.fechaCreacion = UsrEmp.FechaCreacion;
                this.fechaPrimerIngreso = UsrEmp.FechaPrimerIngreso;
                this.fechaUltimoIngreso = UsrEmp.FechaUltimoIngreso;
                this.siActivo = UsrEmp.Activo;
                this.empresaProcedencia = new Empresa(UsrEmp.ID_Empresa);
            }             
            catch (SqlException Sql)
            {
                throw new Exception("No existe tal usuario o su username o password estan mal escritos\n" + Sql.Message);
            }
        }
        public UsuarioEmpresa(string NewUserName, string NewPassWord, int NewID_Empresa) 
        {
            this.userName = NewUserName;
            this.passWord = NewPassWord;
            this.siActivo = true;
            this.empresaProcedencia = new Empresa(NewID_Empresa);
        }

        // Metodos
        public void Insertar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();
            try
            {
                DataContextClasses.UsuariosEmpresa UsuarioEmpToInsert = new DataContextClasses.UsuariosEmpresa();

                UsuarioEmpToInsert.UserName = this.UserName;
                UsuarioEmpToInsert.PassWord = this.PassWord;
                UsuarioEmpToInsert.FechaCreacion = DateTime.Now;
                UsuarioEmpToInsert.ID_Empresa = this.EmpresaProcedencia.ID;
                UsuarioEmpToInsert.Activo = this.siActivo;
                /*UsuarioEmpToInsert.FechaPrimerIngreso = this.FechaPrimerIngreso;
                UsuarioEmpToInsert.FechaUltimoIngreso = this.fechaUltimoIngreso;*/

                DB.UsuariosEmpresas.InsertOnSubmit(UsuarioEmpToInsert);

                DB.SubmitChanges();
            }               
            catch (SqlException Sql)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + Sql.Message);
            }
        }
        public void Actualizar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();
            try
            {
                DataContextClasses.UsuariosEmpresa UsuarioEmpToUpdate = (from ue in DB.UsuariosEmpresas
                                                                         where ue.ID == this.id
                                                                         select ue).First();

                UsuarioEmpToUpdate.UserName = this.userName;
                UsuarioEmpToUpdate.PassWord = this.passWord;
                UsuarioEmpToUpdate.FechaCreacion = this.fechaCreacion;
                UsuarioEmpToUpdate.FechaPrimerIngreso = this.fechaPrimerIngreso;
                UsuarioEmpToUpdate.FechaUltimoIngreso = this.fechaUltimoIngreso;
                UsuarioEmpToUpdate.Activo = this.siActivo;
                UsuarioEmpToUpdate.ID_Empresa = this.EmpresaProcedencia.ID;

                DB.SubmitChanges();
            }
            catch (SqlException Sql)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + Sql.Message);
            }
        }

        public void ToggleActivation()
        {
            try
            {
                this.siActivo = !(this.siActivo);

                this.Actualizar();
            }
            catch (Exception Ex)
            {
                throw Ex;
            }
        }

        public void PublicarVacante(Vacante VacanteAPublicar) 
        {
            throw new NotImplementedException();
        }

        public void ActivarVacante(int VacanteID)
        {
            try
            {

                Vacante VacanteToActivate = (from vta in this.EmpresaProcedencia.Vacantes
                                             where vta.ID == VacanteID
                                             select vta).First();

                VacanteToActivate.ToggleActivation();
            }
            catch (Exception Ex)
            {
                throw Ex;
            }
        }

#warning Chekear bien este metodo
        public void DesactivarVacante(int VacanteID) 
        {            
            Vacante VacanteToDeactivate = (from vtd in this.EmpresaProcedencia.Vacantes
                                           where vtd.ID == VacanteID
                                           select vtd).First();

            if (VacanteToDeactivate != null)
            {
                DataClassesDataContext DB = new DataClassesDataContext();
                try
                {
                    var AplicacionesToDeactivate = from atd in DB.Aplicaciones
                                                   where atd.ID_Vacante == VacanteToDeactivate.ID
                                                   select atd;

                    foreach (DataContextClasses.Aplicacione item in AplicacionesToDeactivate)
                    {
                        item.Activa = false;
                    }

                    DB.SubmitChanges();
                    VacanteToDeactivate.FechaCierre = DateTime.Now;
                    VacanteToDeactivate.ToggleActivation();
                }
                catch (SqlException)
                {
                    DB.Transaction.Rollback();
                    throw new Exception("Hubo un problema con la base de datos");                    
                }
            }
            else 
            {
                throw new Exception("No existe tal vacante");
            }
        }

        public static List<UsuarioEmpresa> GetUsuariosEmpresaByEmpresaID(int EmpresaID)
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            var UsuariosEmpresa = (from ue in DB.UsuariosEmpresas
                                where ue.ID_Empresa == EmpresaID
                                select ue);

            List<UsuarioEmpresa> UsuariosDeEmpresa = new List<UsuarioEmpresa>();

            foreach (var item in UsuariosEmpresa)
            {
                UsuarioEmpresa UsuarioAIntroducir = new UsuarioEmpresa(item.ID);
                UsuariosDeEmpresa.Add(UsuarioAIntroducir);
            }
            return UsuariosDeEmpresa;
        }        
    }
}
